/****************************************************************************
**
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
** This file is part of the QtSql module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial Usage
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file.  Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain
** additional rights. These rights are described in the Nokia Qt LGPL
** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
** package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.  Please review the following information to
** ensure the GNU General Public License version 3.0 requirements will be
** met: http://www.gnu.org/copyleft/gpl.html.
**
** If you are unsure which license is appropriate for your use, please
** contact the sales department at qt-sales@nokia.com.
** $QT_END_LICENSE$
**
****************************************************************************/


/**
 ** Adapted for my purposes
 **/

#ifndef QSQLRELATIONALDELEGATE_H
#define QSQLRELATIONALDELEGATE_H

//#ifdef QT_GUI_LIB

#include <QItemDelegate>
#include <MyModel.h>
#include <QComboBox>
#include <QLineEdit>
#include <QCompleter>
#include <QDateTimeEdit>
//#include <QListView>

QT_BEGIN_HEADER

QT_BEGIN_NAMESPACE

//QT_MODULE(Sql)

class MyDelegate: public QItemDelegate
{
public:

explicit MyDelegate(QObject *parent = 0)
	: QItemDelegate(parent)
{}

~MyDelegate()
{}

QWidget *createEditor(QWidget *parent,
			const QStyleOptionViewItem &option,
			const QModelIndex &index) const
{
	const MyModel *sqlModel = qobject_cast<const MyModel *>(index.model());
	QSqlQueryModel *childModel = sqlModel ? sqlModel->relationModel(index.column()) : 0;
	if (!childModel) {
		QWidget *ret = QItemDelegate::createEditor(parent, option, index);
		if ( sqlModel->colType(index.column()) == QVariant::DateTime ) {
			QDateTimeEdit *t = qobject_cast<QDateTimeEdit*>(ret);
			if (t)
				t->setDisplayFormat("dd.MM.yyyy hh:mm");
		}
		if ( sqlModel->colType(index.column()) == QVariant::Time ) {
			QDateTimeEdit *t = qobject_cast<QDateTimeEdit*>(ret);
			if (t)
				t->setDisplayFormat("hh:mm");
		}
		return ret;
	}

	int relIndex = sqlModel->relationIndex(index.column());
	if (relIndex) {// means not editable
		QComboBox *combo = new QComboBox(parent);
		combo->setModel(childModel);
		combo->setModelColumn(relIndex);
		combo->installEventFilter(const_cast<MyDelegate *>(this));
		return combo;
	} else { // means ediatble
		QLineEdit *edit = new QLineEdit(parent);
		QCompleter *completer = new QCompleter(childModel, edit);
		completer->setCaseSensitivity(Qt::CaseInsensitive);
		completer->setCompletionMode(QCompleter::PopupCompletion);
		edit->setCompleter(completer);
		edit->installEventFilter(const_cast<MyDelegate *>(this));
		return edit;
	}
}

void setEditorData(QWidget *editor, const QModelIndex &index) const
{
	const MyModel *sqlModel = qobject_cast<const MyModel *>(index.model());
	QComboBox *combo = qobject_cast<QComboBox *>(editor);
	if (!sqlModel || !combo) {
		QItemDelegate::setEditorData(editor, index);
		return;
	}
	combo->setCurrentIndex(combo->findText(sqlModel->data(index).toString()));
}

void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
	if (!index.isValid())
		return;

	MyModel *sqlModel = qobject_cast<MyModel *>(model);
	QSqlQueryModel *childModel = sqlModel ? sqlModel->relationModel(index.column()) : 0;
	QComboBox *combo = qobject_cast<QComboBox *>(editor);
	if (!sqlModel || !childModel || !combo) {
		QItemDelegate::setModelData(editor, model, index);
		return;
	}

	int currentItem = combo->currentIndex();
	qDebug() << "Combo current index" << combo->currentText() << combo->currentIndex()
		<< combo->itemText(currentItem);
	int childColIndex = sqlModel->relationIndex(index.column());
	int childEditIndex = 0;
	qDebug() << childModel->data(childModel->index(currentItem, 1));
//    sqlModel->setData(index,
//            childModel->data(childModel->index(currentItem, childColIndex), Qt::DisplayRole),
//            Qt::DisplayRole);
	sqlModel->setData(index,
			childModel->data(childModel->index(currentItem, childEditIndex), Qt::EditRole),
			Qt::EditRole);
}

};

QT_END_NAMESPACE

QT_END_HEADER

#endif // QSQLRELATIONALDELEGATE_H
